// 问题六：Set和List的区别

// 解释：
// Set和List的主要区别：
// 1. Set: 无序、元素唯一
// 2. List: 有序、元素可重复
// 使用场景：
// - 需要唯一性检查时用Set
// - 需要保持顺序或允许重复时用List
// 在Set中存储自定义对象：
// - 必须重写hashCode和==方法

class Product {
  final String id;
  final String name;

  Product(this.id, this.name);

  @override
  bool operator ==(Object other) {
    if (identical(this, other)) return true;
    return other is Product && other.id == id && other.name == name;
  }

  @override
  int get hashCode => id.hashCode ^ name.hashCode;

  @override
  String toString() => 'Product(id: $id, name: $name)';
}

void main() {
  // List示例
  final list = [1, 2, 2, 3, 3, 3];
  print('List内容: $list'); // 允许重复

  // Set示例
  final set = {1, 2, 2, 3, 3, 3}; // 自动去重
  print('Set内容: $set');

  // 自定义对象在Set中
  final productSet = <Product>{};
  final p1 = Product('001', '手机');
  final p2 = Product('001', '手机'); // 相同ID和名称
  final p3 = Product('002', '电脑');

  productSet.add(p1);
  productSet.add(p2); // 不会添加，因为p2 == p1
  productSet.add(p3);

  print('\n自定义对象Set:');
  print('Set大小: ${productSet.length}'); // 2
  print('Set内容: $productSet');

  // 如果没有重写hashCode和==，Set会认为p1和p2是不同的对象
  print('\n如果不重写hashCode和==，Set无法正确去重');
}
